From: Georges Basile Stavracas Neto Date: Fri, 28 Jun 2019 23:48:22 +0000 (-0300) Subject: allView: Switch pages when dragging above or below the grid X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~839^2^2~25 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=ea71172d44c3d36a603a957fe89c899177ee68ae;p=gnome-shell.git allView: Switch pages when dragging above or below the grid This is necessary for being able to drag application icons to folders in different pages. Add a drag motion handler to AllView and handle overshoots when dragging. Only handle it when dragging from AllView. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/664 --- diff --git a/js/ui/appDisplay.js b/js/ui/appDisplay.js index 9b2519348..4cfea7e9c 100644 --- a/js/ui/appDisplay.js +++ b/js/ui/appDisplay.js @@ -335,6 +335,9 @@ var AllView = class AllView extends BaseAppView { Main.queueDeferredWork(this._redisplayWorkId); }); + Main.overview.connect('item-drag-begin', this._onDragBegin.bind(this)); + Main.overview.connect('item-drag-end', this._onDragEnd.bind(this)); + this._nEventBlockerInhibits = 0; } @@ -679,6 +682,61 @@ var AllView = class AllView extends BaseAppView { this.folderIcons[i].adaptToSize(availWidth, availHeight); } + _handleDragOvershoot(dragEvent) { + let [, gridY] = this.actor.get_transformed_position(); + let [, gridHeight] = this.actor.get_transformed_size(); + let gridBottom = gridY + gridHeight; + + // Within the grid boundaries, or already animating + if (dragEvent.y > gridY && dragEvent.y < gridBottom || + this._adjustment.get_transition('value') != null) { + return; + } + + // Moving above the grid + let currentY = this._adjustment.value; + if (dragEvent.y <= gridY && currentY > 0) { + this.goToPage(this._grid.currentPage - 1); + return; + } + + // Moving below the grid + let maxY = this._adjustment.upper - this._adjustment.page_size; + if (dragEvent.y >= gridBottom && currentY < maxY) { + this.goToPage(this._grid.currentPage + 1); + return; + } + } + + _onDragBegin() { + this._dragMonitor = { + dragMotion: this._onDragMotion.bind(this) + }; + DND.addDragMonitor(this._dragMonitor); + } + + _onDragMotion(dragEvent) { + if (!(dragEvent.source instanceof AppIcon)) + return DND.DragMotionResult.CONTINUE; + + let appIcon = dragEvent.source; + + // Handle the drag overshoot. When dragging to above the + // icon grid, move to the page above; when dragging below, + // move to the page below. + if (this._grid.contains(appIcon.actor)) + this._handleDragOvershoot(dragEvent); + + return DND.DragMotionResult.CONTINUE; + } + + _onDragEnd() { + if (this._dragMonitor) { + DND.removeDragMonitor(this._dragMonitor); + this._dragMonitor = null; + } + } + inhibitEventBlocker() { this._nEventBlockerInhibits++; this._eventBlocker.visible = this._nEventBlockerInhibits == 0;